import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'




Vue.use(VueAxios, axios)
const instance = axios.create({
  baseURL: 'http://toutiao.itheima.net',
  timeout: 1000,

});
import {
  getToken
} from './token'
// 添加响应拦截器
instance.interceptors.request.use(
  function (config) {
    // 对响应数据做点什么
    if(getToken()){
      config.headers.Authorization = `Bearer ${getToken().token}`
    }
    return config
  },
  function (error) {
    // 对响应错误做点什么: 响应错误比如参数错误，或者没有登录等
    return Promise.reject(error)
  }
)
export default instance
/* 添加请求拦截器，自动上传token */
instance.interceptors.request.use(
  function (config) {
    //如果用户有登录，就自动添加token
    if (getToken()) {
      config.headers.Authorization = "Bearer " + getToken().token;
    }
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);
/* 添加响应拦截器，拦截token过期的401错误 */
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    console.log(response);
    return response;
  },
  async function (error) {
    // 对响应错误做点什么: 响应错误比如参数错误，或者没有登录等
    /*
复杂逻辑分析： 401分为两种情况
第一种： 用户有登录，只是token过期了。 这个时候就需要刷新token
第二种： 用户没有登录，这个时候就需要跳转登录页
思路整理
判断状态码是不是401
 1.是401,判断用户没有token
  1.1 有token,说明token过期，需要请求刷新token
    1.1.1 成功：更新token,返回当前页
    1.1.2 失败：说明refresh过期，需要重新登录
  1.2 没有token，说明用户未登录，需要重新登录  
 2.不是401，说明是其他问题，例如404路径错误，这个不做处理

*/
    //判断状态码是否401 与 token是否存在
    //判断状态码是不是401
    if (error.response&&error.response.status === 401) {
      //1.是401,判断用户没有token
      if (getToken()) {
        //1.1 有token,说明token过期，需要请求刷新token
        /* 使用try-catch捕捉异常 */
        try {
          //刷新token
          const tokenRes = await axios({
            url: "http://toutiao.itheima.net/v1_0/authorizations",
            method: "put",
            headers: {
              Authorization: `Bearer ${getToken().refresh_token}`,
            },
          });
          //1.1.1 成功：更新token,返回当前页
          console.log("更新了token:" + tokenRes);
          let newToken = getToken();
          newToken.token = tokenRes.data.data.token;
          saveToken(newToken);
          // 返回当前配置信息
          return instance(error.config);
        } catch (err) {
          //1.1.2 失败：说明refresh过期，需要重新登录
          //弹窗提示
          Toast.fail("请重新登录");
          //移除token
          removeToken();
          //跳转登录页
          router.push("/login");
        }
      } else {
        //1.2 没有token，说明用户未登录，需要重新登录
        //弹窗提示
        Toast.fail("请重新登录");
        //跳转登录页
        router.push("/login");
      }
    } else {
      //2.不是401，说明是其他问题，例如404路径错误，这个不做处理
    }

    /* 如果觉得token过期控制台爆红看着不舒服，就可以手动清除控制台打印 */
    setTimeout(() => {
      console.clear();
    }, 2000);
    return Promise.reject(error);
  }
);
